﻿using System;
using System.Data;
using DataAccessLayer.Clases;
using DTO.Clases;

namespace BussinesLayer.Clases
{
    /// <summary>
    /// Representa una clase para la logica de negocio de FacturaProveedor.
    /// </summary>
    public class BussinesFacturaProveedor
    {
        /// <summary>
        /// Proporciona acceso a la capa de datos de FacturaProveedor.
        /// </summary>
        private DaoFacturaProveedor miDaoFacturaProveedor;

        /// <summary>
        /// Proporciona acceso a la capa de datos de ProductoFacturaProveedor.
        /// </summary>
        private DaoProductoFacturaProveedor miDaoProductoFactura;

        /// <summary>
        /// Inicializa una nueva instancia de la clase BussinesFacturaProveedor.
        /// </summary>
        public BussinesFacturaProveedor()
        {
            miDaoFacturaProveedor = new DaoFacturaProveedor();
            miDaoProductoFactura = new DaoProductoFacturaProveedor();
        }

        /// <summary>
        /// Obtiene el consecutivo del número del Lote.
        /// </summary>
        /// <returns></returns>
        public string ObtenerNumeroLote()
        {
            return miDaoFacturaProveedor.ObtenerNumeroLote();
        }

        /// <summary>
        /// Actualiza el registro consecutivo del lote.
        /// </summary>
        /// <param name="lote">Número de lote a actualizar.</param>
        public void ActualizarLote(int lote)
        {
            miDaoFacturaProveedor.ActualizarLote(lote);
        }

        /// <summary>
        /// Ingresa toda la información necesaria del registro de Factura de Proveedor.
        /// </summary>
        /// <param name="miFactura">Factura a ingresar.</param>
        public int IngresarFactura(FacturaProveedor miFactura)
        {
            return miDaoFacturaProveedor.IngresarFactura(miFactura);
        }

        /// <summary>
        /// Obtiene los registros de la consulta de una Factura de Proveedor.
        /// </summary>
        /// <param name="numero">Número de la Factura a consultar.</param>
        /// <param name="activa">Indica si solo se recupera registros activos.</param>
        /// <returns></returns>
        public DataTable ConsultaFacturaProveedor(string numero, bool activa)
        {
            return miDaoFacturaProveedor.ConsultaFacturaProveedor(numero, activa);
        }

        /// <summary>
        /// Obtiene los registros de la consulta de una Factura de Proveedor.
        /// </summary>
        /// <param name="codigo">Codigo del Proveedor a consultar.</param>
        /// <param name="activa">Indica si solo se recupera registros activos.</param>
        /// <param name="registroBase">Registro base para la consulta.</param>
        /// <param name="registroMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaFacturaProveedor(int codigo, bool activa, int registroBase, int registroMax)
        {
            return miDaoFacturaProveedor.ConsultaFacturaProveedor(codigo, activa, registroBase, registroMax);
        }

        /// <summary>
        /// Obtiene el total de registros de una consulta de Factura de Proveedor.
        /// </summary>
        /// <param name="codigo">Codigo del Proveedor a consultar.</param>
        /// <param name="activa">Indica si solo se recupera registros activos.</param>
        /// <returns></returns>
        public long GetRowsConsultaFacturaProveedor(int codigo, bool activa)
        {
            return miDaoFacturaProveedor.GetRowsConsultaFacturaProveedor(codigo, activa);
        }

        /// <summary>
        /// Obtiene los registros de la consulta de una Factura de Proveedor.
        /// </summary>
        /// <param name="fecha">Fecha con la cual se compara la fecha con la que ingreso la Factura.</param>
        /// <param name="activa">Indica si solo se recupera registros activos.</param>
        /// <param name="registroBase">Registro base para la consulta.</param>
        /// <param name="registroMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaFacturaProveedor
            (DateTime fecha, bool activa, int registroBase, int registroMax)
        {
            return miDaoFacturaProveedor.ConsultaFacturaProveedor(fecha, activa, registroBase, registroMax);
        }

        /// <summary>
        /// Obtiene el total de registros de una consulta de Factura de Proveedor.
        /// </summary>
        /// <param name="fecha">Fecha con la cual se compara la fecha con la que ingreso la Factura.</param>
        /// <param name="activa">Indica si solo se recupera registros activos.</param>
        /// <returns></returns>
        public long GetRowsConsultaFacturaProveedor(DateTime fecha, bool activa)
        {
            return miDaoFacturaProveedor.GetRowsConsultaFacturaProveedor(fecha, activa);
        }

        /// <summary>
        /// Obtiene los registros de la consulta de una Factura de Proveedor.
        /// </summary>
        /// <param name="codigo">Codigo del Proveedor a consultar.</param>
        /// <param name="fecha">Fecha con la cual se compara la fecha con la que ingreso la Factura.</param>
        /// <param name="activa">Indica si solo se recupera registros activos.</param>
        /// <returns></returns>
        public DataTable ConsultaFacturaProveedor(int codigo, DateTime fecha, bool activa)
        {
            return miDaoFacturaProveedor.ConsultaFacturaProveedor(codigo, fecha, activa);
        }

        /// <summary>
        /// Obtiene los registros de la consulta de una Factura de Proveedor.
        /// </summary>
        /// <param name="fecha1">Primer fecha que proporciona el periodo.</param>
        /// <param name="fecha2">Segunda fecha que proporciona el periodo.</param>
        /// <param name="activa">Indica si solo se recupera registros activos.</param>
        /// <param name="registroBase">Registro base para la consulta.</param>
        /// <param name="registroMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaFacturaProveedor
            (DateTime fecha1, DateTime fecha2, bool activa, int registroBase, int registroMax)
        {
            return miDaoFacturaProveedor.ConsultaFacturaProveedor
                (fecha1, fecha2, activa, registroBase, registroMax);
        }

        /// <summary>
        /// Obtiene el total de registros de una consulta de Factura de Proveedor.
        /// </summary>
        /// <param name="fecha1">Primer fecha que proporciona el periodo.</param>
        /// <param name="fecha2">Segunda fecha que proporciona el periodo.</param>
        /// <param name="activa">Indica si solo se recupera registros activos.</param>
        /// <returns></returns>
        public long GetRowsConsultaFacturaProveedor(DateTime fecha1, DateTime fecha2, bool activa)
        {
            return miDaoFacturaProveedor.GetRowsConsultaFacturaProveedor(fecha1, fecha2, activa);
        }

        /// <summary>
        /// Obtiene los registros de la consulta de una Factura de Proveedor.
        /// </summary>
        /// <param name="codigo">Codigo del Proveedor a consultar.</param>
        /// <param name="fecha1">Primer fecha que proporciona el periodo.</param>
        /// <param name="fecha2">Segunda fecha que proporciona el periodo.</param>
        /// <param name="activa">Indica si solo se recupera registros activos.</param>
        /// <param name="registroBase">Registro base para la consulta.</param>
        /// <param name="registroMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaFacturaProveedor
            (int codigo, DateTime fecha1, DateTime fecha2, bool activa, int registroBase, int registroMax)
        {
            return miDaoFacturaProveedor.ConsultaFacturaProveedor
                (codigo, fecha1, fecha2, activa, registroBase, registroMax);
        }

        /// <summary>
        /// Obtiene el total de registros de una consulta de Factura de Proveedor.
        /// </summary>
        /// <param name="codigo">Codigo del Proveedor a consultar.</param>
        /// <param name="fecha1">Primer fecha que proporciona el periodo.</param>
        /// <param name="fecha2">Segunda fecha que proporciona el periodo.</param>
        /// <param name="activa">Indica si solo se recupera registros activos.</param>
        /// <returns></returns>
        public long GetRowsConsultaFacturaProveedor
            (int codigo, DateTime fecha1, DateTime fecha2, bool activa)
        {
            return miDaoFacturaProveedor.GetRowsConsultaFacturaProveedor
                (codigo, fecha1, fecha2, activa);
        }

        /// <summary>
        /// Obtiene los registros de los producto relacionado a una Factura de Proveedor.
        /// </summary>
        /// <param name="id">Id de la Factura consultada.</param>
        /// <returns></returns>
        public DataTable ConsultaProductoFacturaProveedor(int id)
        {
            var miTabla = CrearDataTable();
            var tabla = miDaoFacturaProveedor.ConsultaProductoFacturaProveedor(id);
            foreach (DataRow row in tabla.Rows)
            {
                var color = new ElColor();
                color.MapaBits = Convert.ToString(row["Color"]);
                var row_ = miTabla.NewRow();
                row_["Id"] = row["Id"];
                row_["Numero"] = row["Numero"];
                row_["Codigo"] = row["Codigo"];
                row_["Articulo"] = row["Articulo"];
                row_["Cantidad"] = row["Cantidad"];
                row_["Unidad"] = row["Unidad"];
                row_["IdMedida"] = row["IdMedida"];
                row_["Medida"] = row["Medida"];
                row_["IdColor"] = row["IdColor"];
                row_["Color"] = color.ImagenBit;
                row_["IdLote"] = row["IdLote"];
                row_["Lote"] = row["Lote"];
                row_["Iva"] = row["Iva"].ToString() + "%";
                row_["Valor"] = row["Valor"];
                row_["Descuento"] = row["Descuento"].ToString() + "%";
                row_["ValorMenosDescto"] = Convert.ToDouble(row["Valor"]) -
                              (Convert.ToDouble(row["Valor"]) * Convert.ToDouble(row["Descuento"]) / 100);
                row_["ValorIva"] = Convert.ToDouble(row_["ValorMenosDescto"]) * Convert.ToDouble(row["Iva"]) / 100;
                row_["TotalMasIva"] = Convert.ToDouble(row_["ValorMenosDescto"]) + Convert.ToDouble(row_["ValorIva"]);
                row_["Total"] = Convert.ToDouble(row_["TotalMasIva"]) * Convert.ToDouble(row["Cantidad"]);
                miTabla.Rows.Add(row_);
            }
            tabla.Clear();
            tabla = null;
            return miTabla;
        }

        /// <summary>
        /// Edita los datos de un registro de FacturaProveedor en base de datos.
        /// </summary>
        /// <param name="factura">Registro de FacturaProveedor a editar.</param>
        public void EditarFacturaProveedor(FacturaProveedor factura)
        {
            miDaoFacturaProveedor.EditarFacturaProveedor(factura);
        }

        /// <summary>
        /// Ingresa un registro de ProductoFacturaProveedor estableciendo la relacion necesaria.
        /// </summary>
        /// <param name="producto">Registro de ProductoFacturaProveedor a ingresar.</param>
        public void IngresarProductoFacturaProveedor(ProductoFacturaProveedor producto)
        {
            miDaoProductoFactura.IngresarProductoFacturaProveedor(producto);
        }

        /// <summary>
        /// Edita los datos de un registro de ProductoFacturaProveedor en base de datos.
        /// </summary>
        /// <param name="producto">Registro de ProductoFacturaProveedor a editar.</param>
        public void EditarProductoFacturaProveedor(ProductoFacturaProveedor producto)
        {
            miDaoProductoFactura.EditarProductoFacturaProveedor(producto);
        }

        /// <summary>
        /// Elimina un registro de Producto de Factura Proveedor.
        /// </summary>
        /// <param name="id">Id del registro del Producto a eliminar.</param>
        public void EliminarProductoFacturaProveedor(int id)
        {
            miDaoProductoFactura.EliminarProductoFacturaProveedor(id);
        }

        /// <summary>
        /// Crea las respectivas columnas del DataTable para ProductoFacturaProveedor.
        /// </summary>
        private DataTable CrearDataTable()
        {
            var miTabla = new DataTable();
            miTabla.Columns.Add(new DataColumn("Id", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Numero", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Codigo", typeof(string)));
            miTabla.Columns.Add(new DataColumn("Articulo", typeof(string)));
            miTabla.Columns.Add(new DataColumn("Cantidad", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Unidad", typeof(string)));
            miTabla.Columns.Add(new DataColumn("IdMedida", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Medida", typeof(string)));
            miTabla.Columns.Add(new DataColumn("IdColor", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Color", typeof(System.Drawing.Image)));
            miTabla.Columns.Add(new DataColumn("IdLote", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Lote", typeof(string)));
            miTabla.Columns.Add(new DataColumn("Iva", typeof(string)));
            miTabla.Columns.Add(new DataColumn("Valor", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Total", typeof(double)));
            miTabla.Columns.Add(new DataColumn("ValorIva", typeof(double)));
            miTabla.Columns.Add(new DataColumn("TotalMasIva", typeof(double)));
            miTabla.Columns.Add(new DataColumn("Descuento", typeof(string)));
            miTabla.Columns.Add(new DataColumn("ValorMenosDescto", typeof(double)));
            return miTabla;
        }
    }
}